#ifndef CJSONOBJECT_H
#define CJSONOBJECT_H

#include <vector>
#include "cjsonvaluestring.h"
#include "cjsonvaluenumber.h"
#include "cjsonvaluefloat.h"
#include "cjsonvaluebool.h"
#include "cjsonvaluenull.h"
#include "cjsonarray.h"

#include <map>

typedef std::map <jstring, CJsonValue*> CPares;

class CJsonArray;

class CJsonObject : public CJsonValue
{
private:
    mutable CPares pares;
public:
    LIB_PRE CJsonObject();
    LIB_PRE CJsonObject(const CJsonObject * value);
    LIB_PRE ~CJsonObject();
    LIB_PRE jstring ToString() const;
    //
    LIB_PRE void AddPare(const jchar * name, const jchar            * value); //CJsonString and CJsonNull
    LIB_PRE void AddPare(const jchar * name,       jstring            value); //CJsonString
    LIB_PRE void AddPare(const jchar * name,       jint               value); //CJsonNumber
    LIB_PRE void AddPare(const jchar * name,       double             value); //CJsonFloat
    LIB_PRE void AddPare(const jchar * name,       bool               value); //CJsonBool
    LIB_PRE void AddPare(const jchar * name, const CJsonValue       * value); //CJsonValue
    LIB_PRE void AddPare(const jchar * name, const CJsonValueString * value); //CJsonString
    LIB_PRE void AddPare(const jchar * name, const CJsonValueNumber * value); //CJsonNumber
    LIB_PRE void AddPare(const jchar * name, const CJsonValueFloat  * value); //CJsonFloat
    LIB_PRE void AddPare(const jchar * name, const CJsonValueBool   * value); //CJsonBool
    LIB_PRE void AddPare(const jchar * name, const CJsonValueNull   * value); //CJsonNull
    LIB_PRE void AddPare(const jchar * name, const CJsonObject      * value); //CJsonObject
    LIB_PRE void AddPare(const jchar * name, const CJsonArray       * value); //CJsonAray
    LIB_PRE void AddPare(jstring name, const jchar            * value); //CJsonString and CJsonNull
    LIB_PRE void AddPare(jstring name,       jstring            value); //CJsonString
    LIB_PRE void AddPare(jstring name,       jint               value); //CJsonNumber
    LIB_PRE void AddPare(jstring name,       double             value); //CJsonFloat
    LIB_PRE void AddPare(jstring name,       bool               value); //CJsonBool
    LIB_PRE void AddPare(jstring name, const CJsonValue       * value); //CJsonValue
    LIB_PRE void AddPare(jstring name, const CJsonValueString * value); //CJsonString
    LIB_PRE void AddPare(jstring name, const CJsonValueNumber * value); //CJsonNumber
    LIB_PRE void AddPare(jstring name, const CJsonValueFloat  * value); //CJsonFloat
    LIB_PRE void AddPare(jstring name, const CJsonValueBool   * value); //CJsonBool
    LIB_PRE void AddPare(jstring name, const CJsonValueNull   * value); //CJsonNull
    LIB_PRE void AddPare(jstring name, const CJsonObject      * value); //CJsonObject
    LIB_PRE void AddPare(jstring name, const CJsonArray       * value); //CJsonAray
    //
    LIB_PRE const CJsonValue * operator [] (const jchar * name);
    LIB_PRE const CJsonValue * operator [] (jstring name);
    //
    LIB_PRE void GetNames(std::vector <jstring> & names) const;
    //
    LIB_PRE bool Empty() const;
    LIB_PRE void Erase(const jchar * name);
    LIB_PRE void Erase(jstring name);
    LIB_PRE void Clear();
    LIB_PRE void GetValue(std::map <jstring, CJsonValue*> & value) const;
};

#endif // CJSONOBJECT_H

